package threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * # @File  : FixedThreadPool.java
 * # @Author: Lomo
 * # @Site  : lomo.space
 * # @Date  : 2021-09-01
 * # @Desc  :  定长线程池 newFixedThreadPool，每当提交一个任务就创建一个线程，直到达到线程池的最大数量，这时线程数量不再变化，当线程发生错误结束时，线程池会补充一个新的线程
 * 测试「定长线程池」, 线程池的容量为3，提交6个任务，根据打印结果可以看出先执行前3个任务，3个任务结束后再执行后面的任务
 *
 * 适用：执行长期任务
 */
public class FixedThreadPool {
    //定长线程池 3 个线程，每当提交一个任务就创建一个线程，
    // 直到达到线程池的最大数量，这时线程数量不再变化，当线程发生错误结束时，线程池会补充一个新的线程
    private static ExecutorService fixedExecutor = Executors.newFixedThreadPool(3);

    private static void testFixedExecutor() {
        // 提交 6 个任务, 通过测试输出结果发现，线程池设定3个线程时, 当我们期望需要有6个任务同时使用6个线程执行时，
        // 它是前3个任务分别使用3个线程去执行，然后后3个任务分别使用3个线程资源再去执行任务
        for (int i = 0; i < 6; i ++) {
            final int index = i;
            fixedExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    // 重写的 run 方法这里边 执行我们的任务
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "index: " + index);
                }
            });
        }

        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("4s 后... ...");
        fixedExecutor.shutdown();
    }

    public static void main(String[] args) {
        testFixedExecutor();
    }
}
